/**
 * 格式化日期时间
 * @param date 日期对象或时间戳或日期字符串
 * @param format 格式化模板，默认 YYYY-MM-DD HH:mm:ss
 */
export const formatDateTime = (
  date: Date | number | string,
  format = "YYYY-MM-DD HH:mm:ss"
): string => {
  const d = new Date(date);

  const year = d.getFullYear();
  const month = d.getMonth() + 1;
  const day = d.getDate();
  const hour = d.getHours();
  const minute = d.getMinutes();
  const second = d.getSeconds();

  const padStart = (num: number): string => {
    return num.toString().padStart(2, "0");
  };

  return format
    .replace("YYYY", year.toString())
    .replace("MM", padStart(month))
    .replace("DD", padStart(day))
    .replace("HH", padStart(hour))
    .replace("mm", padStart(minute))
    .replace("ss", padStart(second));
};

/**
 * 格式化日期
 * @param date 日期对象或时间戳或日期字符串
 * @param format 格式化模板，默认 YYYY-MM-DD
 */
export const formatDate = (
  date: Date | number | string,
  format = "YYYY-MM-DD"
): string => {
  return formatDateTime(date, format);
};

/**
 * 获取相对时间描述
 * @param date 日期对象或时间戳或日期字符串
 */
export const getRelativeTime = (date: Date | number | string): string => {
  const now = new Date().getTime();
  const target = new Date(date).getTime();
  const diff = now - target;

  // 小于1分钟
  if (diff < 60 * 1000) {
    return "刚刚";
  }
  // 小于1小时
  if (diff < 60 * 60 * 1000) {
    return `${Math.floor(diff / (60 * 1000))}分钟前`;
  }
  // 小于24小时
  if (diff < 24 * 60 * 60 * 1000) {
    return `${Math.floor(diff / (60 * 60 * 1000))}小时前`;
  }
  // 小于30天
  if (diff < 30 * 24 * 60 * 60 * 1000) {
    return `${Math.floor(diff / (24 * 60 * 60 * 1000))}天前`;
  }
  // 大于30天则返回具体日期
  return formatDate(date);
};
